package persistencia.carreras.ensambladores.general;


import modelo.geometria.Circunferencia;
import modelo.seniales.ColorSemaforo;
import modelo.seniales.EsquinaSemaforo;
import modelo.seniales.Semaforo;
import persistencia.IAlmacen;
import persistencia.IEnsamblador;
import persistencia.IIngrediente;
import persistencia.IProducto;
import persistencia.carreras.ensambladores.Campos;
import persistencia.carreras.ensambladores.Dummies;
import persistencia.carreras.ensambladores.EnsambladorComun;
import persistencia.compartido.ProductoSinValores;
import persistencia.compartido.Tipo;
import persistencia.excepciones.EscritorIncompatible;
import persistencia.excepciones.LectorIncompatible;

import compartido.IEntidad;

public class EnsambladorSemaforo implements IEnsamblador {

	@Override
	public boolean esComptabile(IProducto p) {
		return true;
	}
	
	protected static ColorSemaforo leerColorSemaforo(IProducto p, String prefijo) {
		String valor = p.obtenerIngrediente(prefijo+Campos.color).getValor();
		return ColorSemaforo.valueOf(valor);
	}
	
	protected static EsquinaSemaforo leerEsquinaSemaforo(IProducto p, String prefijo) {
		String valor = p.obtenerIngrediente(prefijo+Campos.esquina).getValor();
		return EsquinaSemaforo.valueOf(valor);
	}	
	
	@Override
	public IEntidad leer(IProducto p, IAlmacen almacen) throws LectorIncompatible {
		long identificador = Long.valueOf(p.getNombre());
		Circunferencia vision = Campos.leerVision(p,"");
		ColorSemaforo color = leerColorSemaforo(p,"");
		EsquinaSemaforo esquina = leerEsquinaSemaforo(p,"");
		int cambioColor = Campos.leerInteger(p, Campos.cambioColor);
		
		Semaforo s = new Semaforo(identificador, vision.getCentro(), vision.getRadio(), esquina, color, cambioColor);
		return s;
	}
	
	@Override
	public boolean esCompatible(IEntidad e) {
		return (e instanceof Semaforo);
	}

	@Override
	public IProducto escribir(IEntidad e, IAlmacen fabrica) throws EscritorIncompatible {
		if (!esCompatible(e))
			throw new EscritorIncompatible();
		
		Semaforo s = (Semaforo)e;
		Tipo<IEntidad> tipo = new Tipo<IEntidad>(Semaforo.class);
		
		EnsambladorComun comun = new EnsambladorComun(fabrica);
		IProducto p = fabrica.crearProducto(Campos.identificador,s.getIdentificador(),tipo);
		comun.armarTransaccion(p,s);
		comun.armarObstaculo(p,s);
		
		IIngrediente color = comun.armarIngrediente(Campos.color, s.getColor());
		p.modificar(color);
		IIngrediente esquina = comun.armarIngrediente(Campos.esquina, s.getEsquina());
		p.modificar(esquina);
		IIngrediente cambioColor = comun.armarIngrediente(Campos.cambioColor, s.getTiempoCambioColor());
		p.modificar(cambioColor);
		
		return p;
	}

	@Override
	public IProducto getDummy(Tipo<IEntidad> tipo) throws EscritorIncompatible {
		Tipo<IEntidad> acepta = new Tipo<IEntidad>(Semaforo.class);
		if (!acepta.esSuperTipoDe(tipo))
			throw new EscritorIncompatible();
		
		ProductoSinValores p = new ProductoSinValores();
		p.agregarCampo(Campos.identificador);
		//Dummies.esTransaccion(p, "");
		Dummies.esObstaculo(p, "");
		p.agregarCampo(Campos.color);
		p.agregarCampo(Campos.esquina);
		p.agregarCampo(Campos.cambioColor);
		
		return p;
	}
	
}
